package com.icinfo.cloud.provider.punish.strategy.appcase;

import com.icinfo.cloud.provider.exception.BusinessException;
import com.icinfo.cloud.provider.punish.dto.CheckObjectZtcSourceTypeDto;
import com.icinfo.cloud.provider.punish.enums.ZtcSourceTypeEnum;
import org.springframework.context.ApplicationContext;

import java.util.Objects;
import java.util.Optional;

/**
 * 直通车文书来源类型狗子
 *
 * @author Junfeng.Chen
 * @date 2024/3/6 10:07
 **/
public abstract class BaseZtcSourceTypeHook {
    /**
     * 获取直通车文书钩子
     * @param sourceType 来源类型
     * @param applicationContext spring上下文
     * @return 钩子对象
     */
    public static BaseZtcSourceTypeHook getHook(ZtcSourceTypeEnum sourceType, ApplicationContext applicationContext) {
        if (Objects.isNull(sourceType)) {
            throw new BusinessException("直通车文书来源类型不能为空");
        }
        Optional<BaseZtcSourceTypeHook> first = applicationContext.getBeansOfType(BaseZtcSourceTypeHook.class).values()
                .stream().filter(hook -> sourceType.equals(hook.getSourceType()))
                .findFirst();

        return first.orElseThrow(() -> new BusinessException("找不到该直通车文书来源类型的钩子配置"));
    }

    /**
     * 获取文书来源类型
     *
     * @return
     */
    abstract public ZtcSourceTypeEnum getSourceType();

    /**
     * 保存文书完成后的钩子
     *
     * @param dto
     */
    abstract public void appCaseSaveHook(CheckObjectZtcSourceTypeDto dto);

    /**
     * 删除文书完成后的钩子
     *
     * @param dto
     */
    abstract public void appCaseDeleteHook(CheckObjectZtcSourceTypeDto dto);
}
